home *** CD-ROM | disk | FTP | other *** search
/ Personal Computer World 2009 February / PCWFEB09.iso / Software / Linux / Kubuntu 8.10 / kubuntu-8.10-desktop-i386.iso / casper / filesystem.squashfs / usr / lib / ruby / 1.8 / base64.rb < prev    next >
Text File  |  2007-07-16  |  3KB  |  134 lines

  1. #
  2. # = base64.rb: methods for base64-encoding and -decoding stings
  3. #
  4. # Author:: Yukihiro Matsumoto 
  5. # Documentation:: Dave Thomas and Gavin Sinclair
  6. #
  7. # Until Ruby 1.8.1, these methods were defined at the top-level.  Now
  8. # they are in the Base64 module but included in the top-level, where
  9. # their usage is deprecated.
  10. #
  11. # See Base64 for documentation.
  12. #
  13.  
  14. require "kconv"
  15.  
  16.  
  17. # The Base64 module provides for the encoding (#encode64) and decoding
  18. # (#decode64) of binary data using a Base64 representation.
  19. # The following particular features are also provided:
  20. # - encode into lines of a given length (#b64encode)
  21. # - decode the special format specified in RFC2047 for the
  22. #   representation of email headers (decode_b)
  23. #
  24. # == Example
  25. #
  26. # A simple encoding and decoding. 
  27. #     require "base64"
  28. #
  29. #     enc   = Base64.encode64('Send reinforcements')
  30. #                         # -> "U2VuZCByZWluZm9yY2VtZW50cw==\n" 
  31. #     plain = Base64.decode64(enc)
  32. #                         # -> "Send reinforcements"
  33. #
  34. # The purpose of using base64 to encode data is that it translates any
  35. # binary data into purely printable characters.  It is specified in
  36. # RFC 2045 (http://www.faqs.org/rfcs/rfc2045.html).
  37.  
  38. module Base64
  39.   module_function
  40.  
  41.   # Returns the Base64-decoded version of +str+.
  42.   #
  43.   #   require 'base64'
  44.   #   str = 'VGhpcyBpcyBsaW5lIG9uZQpUaGlzIG' +
  45.   #         'lzIGxpbmUgdHdvClRoaXMgaXMgbGlu' +
  46.   #         'ZSB0aHJlZQpBbmQgc28gb24uLi4K'
  47.   #   puts Base64.decode64(str)
  48.   #
  49.   # <i>Generates:</i>
  50.   #
  51.   #    This is line one
  52.   #    This is line two
  53.   #    This is line three
  54.   #    And so on...
  55.  
  56.   def decode64(str)
  57.     str.unpack("m")[0]
  58.   end
  59.  
  60.  
  61.   # Decodes text formatted using a subset of RFC2047 (the one used for
  62.   # mime-encoding mail headers).
  63.   #
  64.   # Only supports an encoding type of 'b' (base 64), and only supports
  65.   # the character sets ISO-2022-JP and SHIFT_JIS (so the only two
  66.   # encoded word sequences recognized are <tt>=?ISO-2022-JP?B?...=</tt> and
  67.   # <tt>=?SHIFT_JIS?B?...=</tt>).  Recognition of these sequences is case
  68.   # insensitive.
  69.  
  70.   def decode_b(str)
  71.     str.gsub!(/=\?ISO-2022-JP\?B\?([!->@-~]+)\?=/i) {
  72.       decode64($1)
  73.     }
  74.     str = Kconv::toeuc(str)
  75.     str.gsub!(/=\?SHIFT_JIS\?B\?([!->@-~]+)\?=/i) {
  76.       decode64($1)
  77.     }
  78.     str = Kconv::toeuc(str)
  79.     str.gsub!(/\n/, ' ') 
  80.     str.gsub!(/\0/, '')
  81.     str
  82.   end
  83.  
  84.   # Returns the Base64-encoded version of +str+.
  85.   #
  86.   #    require 'base64'
  87.   #    Base64.b64encode("Now is the time for all good coders\nto learn Ruby")
  88.   #
  89.   # <i>Generates:</i>
  90.   #
  91.   #    Tm93IGlzIHRoZSB0aW1lIGZvciBhbGwgZ29vZCBjb2RlcnMKdG8gbGVhcm4g
  92.   #    UnVieQ==
  93.  
  94.   def encode64(bin)
  95.     [bin].pack("m")
  96.   end
  97.  
  98.   # _Prints_ the Base64 encoded version of +bin+ (a +String+) in lines of
  99.   # +len+ (default 60) characters.
  100.   #
  101.   #    require 'base64'
  102.   #    data = "Now is the time for all good coders\nto learn Ruby" 
  103.   #    Base64.b64encode(data)
  104.   #
  105.   # <i>Generates:</i>
  106.   #
  107.   #    Tm93IGlzIHRoZSB0aW1lIGZvciBhbGwgZ29vZCBjb2RlcnMKdG8gbGVhcm4g
  108.   #    UnVieQ==
  109.  
  110.   def b64encode(bin, len = 60)
  111.     encode64(bin).scan(/.{1,#{len}}/) do
  112.       print $&, "\n"
  113.     end
  114.   end 
  115.  
  116.  
  117.   module Deprecated # :nodoc:
  118.     include Base64
  119.  
  120.     for m in Base64.private_instance_methods(false)
  121.       module_eval %{
  122.         def #{m}(*args)
  123.           warn("\#{caller(1)[0]}: #{m} is deprecated; use Base64.#{m} instead")
  124.           super
  125.         end
  126.       }
  127.     end
  128.   end
  129. end
  130.  
  131. include Base64::Deprecated
  132.